/**
  ******************************************************************************
  * @file    jtt808.h
  * @author  lishelin
  * @version V1.0.1
  * @date    XX-XX-2017
  * @brief   
  ******************************************************************************
  * @attention
  *
	*	MIT License
	*
	*	Permission is hereby granted, free of charge, to any person obtaining a copy
	*	of this software and associated documentation files (the "Software"), to deal
	*	in the Software without restriction, including without limitation the rights
	*	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
	*	copies of the Software, and to permit persons to whom the Software is
	*	furnished to do so, subject to the following conditions:

	*	The above copyright notice and this permission notice shall be included in all
	*	copies or substantial portions of the Software.

	*	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
	*	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	*	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
	*	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
	*	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
	*	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
	*	SOFTWARE.
    
    *
    * Change Logs:
    * Date           Author       Notes
    * 2017-XX-XX     lishelin     the first version    
    
    
  *
  * <h2><center>&copy; COPYRIGHT 2017 lishelin0505@163.com</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/




#ifndef JTT808_H
#define JTT808_H
 
#include <stdint.h>
 
/**   @defgroup JTT808 
    * @brief JTT808 driver modules
    * @{
*/

#define JTT808_MODULE    //if we don't need this function ,please comment it

#ifdef JTT808_MODULE
 
typedef uint8_t BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint8_t BCD;
typedef uint8_t* STRING;

#define MSG_FLAG                     0x7e

#define BIT_0                       ((uint32_t)0x00000001)        /*!< bit 0 */
#define BIT_1                       ((uint32_t)0x00000002)        /*!< bit 1 */
#define BIT_2                       ((uint32_t)0x00000004)        /*!< bit 2 */
#define BIT_3                       ((uint32_t)0x00000008)        /*!< bit 3 */
#define BIT_4                       ((uint32_t)0x00000010)        /*!< bit 4 */
#define BIT_5                       ((uint32_t)0x00000020)        /*!< bit 5 */
#define BIT_6                       ((uint32_t)0x00000040)        /*!< bit 6 */
#define BIT_7                       ((uint32_t)0x00000080)        /*!< bit 7 */
#define BIT_8                       ((uint32_t)0x00000100)        /*!< bit 8 */
#define BIT_9                       ((uint32_t)0x00000200)        /*!< bit 9 */
#define BIT_10                      ((uint32_t)0x00000400)        /*!< bit 10 */
#define BIT_11                      ((uint32_t)0x00000800)        /*!< bit 11 */
#define BIT_12                      ((uint32_t)0x00001000)        /*!< bit 12 */
#define BIT_13                      ((uint32_t)0x00002000)        /*!< bit 13 */
#define BIT_14                      ((uint32_t)0x00004000)        /*!< bit 14 */
#define BIT_15                      ((uint32_t)0x00008000)        /*!< bit 15 */

#define BIT_16                      ((uint32_t)0x00010000)        /*!< bit 16 */
#define BIT_17                      ((uint32_t)0x00020000)        /*!< bit 17 */
#define BIT_18                      ((uint32_t)0x00040000)        /*!< bit 18 */
#define BIT_19                      ((uint32_t)0x00080000)        /*!< bit 19 */
#define BIT_20                      ((uint32_t)0x00100000)        /*!< bit 20 */
#define BIT_21                      ((uint32_t)0x00200000)        /*!< bit 21 */
#define BIT_22                      ((uint32_t)0x00400000)        /*!< bit 22 */
#define BIT_23                      ((uint32_t)0x00800000)        /*!< bit 23 */
#define BIT_24                      ((uint32_t)0x01000000)        /*!< bit 24 */
#define BIT_25                      ((uint32_t)0x02000000)        /*!< bit 25 */
#define BIT_26                      ((uint32_t)0x04000000)        /*!< bit 26 */
#define BIT_27                      ((uint32_t)0x08000000)        /*!< bit 27 */
#define BIT_28                      ((uint32_t)0x10000000)        /*!< bit 28 */
#define BIT_29                      ((uint32_t)0x20000000)        /*!< bit 29 */
#define BIT_30                      ((uint32_t)0x40000000)        /*!< bit 30 */
#define BIT_31                      ((uint32_t)0x80000000)        /*!< bit 31 */



#define DEV_CMD_RESPONSE                   0x0001               /*!<  终端通用应答          */
#define DEV_CMD_HEART_BEAT                 0x0002               /*!<  终端心跳              */
#define DEV_CMD_UNREGISTER                 0x0003               /*!<  终端注销              */
#define DEV_CMD_AUTHENTICATION             0x0102               /*!<  终端鉴权              */
#define DEV_CMD_PARAMETER                  0x0104               /*!<  终端参数              */
#define DEV_CMD_ATTRIBUTE                  0x0107               /*!<  查询终端属性应答      */
#define DEV_CMD_UPLOAD_RESULT              0x0108               /*!<  终端升级结果通知      */
#define DEV_CMD_LOCATION                   0x0200               /*!<  位置信息汇报          */
#define DEV_CMD_EVENT_REPORT               0x0301               /*!<  dev_event_report      */
#define DEV_CMD_ASK_ANSWER                 0x0302               /*!<  提问应答              */
#define DEV_CMD_MSG_SET                    0x0303               /*!<  信息点播/取消         */
#define DEV_CMD_CONTROL_CAR_RET            0x0500               /*!<  车辆控制应答          */
#define DEV_CMD_RUN_RECORD_RET             0x0700               /*!<  行驶记录数据上传      */
#define DEV_CMD_WAYBILL_RET                0x0701               /*!<  电子运单上报          */
#define DEV_CMD_DRIVER_RET                 0x0702               /*!<  驾驶员身份信息采集上报*/
#define DEV_CMD_DATA_UPLOAD                0x0704               /*!<  定位数据批量上传      */
#define DEV_CMD_CAN_DATA_UPLOAD            0x0705               /*!<  CAN 总线数据上传      */
#define DEV_CMD_MEDIA_DATA_UPLOAD          0x0801               /*!<  多媒体数据上传        */
#define DEV_CMD_MEDIA_CHECK_UPLOAD         0x0802               /*!<  存储多媒体数据检索    */
#define DEV_CMD_TRANS_DATA                 0x0900               /*!<  数据上行透传          */
#define DEV_CMD_RSA                        0x0A00               /*!<  终端RSA 公钥          */
#define DEV_CMD_RAR                        0x0901               /*!<  数据压缩上报          */

/*! 错误码 */
typedef enum
{
	RET_OK, 		  			//!< 成功
	RET_FAILED,					//!< 失败
	RET_MESSAGE_ERROR,	        //!< 消息有误
	RET_NOT_SUPPORT,		    //!< 不支持
	RET_ALARM,					//!< 报警处理确认
	RET_PARAMETER_ERROR         //!< 参数错误
}ERROR_CODE;

/*! 注册结果 */
typedef enum
{
	REGISTER_OK,                //!<  成功
	REGISTER_CAR_REGISTERED,    //!< 车辆已被注册
	REGISTER_HAVE_NO_CAR,       //!< 数据库中无该车辆
	REGISTER_DEV_REGISTERED,    //!< 终端已被注册
	REGISTER_HAVE_NO_DEV,	    //!< 数据库中无该终端
}STR_REGISTER_RESULT;

/*! IC 卡读取结果  */
typedef enum
{
    IC_OK,              //!< IC 卡读卡成功
    IC_NOT_PASS_ERR,    //!< 读卡失败，原因为卡片密钥认证未通过
    IC_LOCK_ERR,        //!< 读卡失败，原因为卡片已被锁定
    IC_PULL_OUT_ERR,    //!< 读卡失败，原因为卡片被拔出
    IC_CHECK_ERR,       //!< 读卡失败，原因为数据校验错
}IC_READ_RESULT;

/*! 透传消息类型  */
typedef enum
{
    TRANS_GNSS = 0X00,     //!< GNSS 模块详细定位数据
    TRANS_IC = 0x0B,       //!< 道路运输证IC 卡信息
    TRANS_UART1 = 0x41,    //!< 串口1 透传
    TRANS_UART2 = 0x42,    //!< 串口2 透传
    TRANS_USER_START = 0xF0,     //!< 用户自定义透传
}DATA_PASS_THROUGH_TYPE;

/*! 消息头  */
typedef struct
{
	WORD id_msg;      				//!< 消息ID
	WORD attribute_msg;				//!< 消息体属性
	BCD  phone_msg[6];			    //!< 终端手机号
	WORD serial_msg; 				//!< 消息流水号
	WORD total_package_msg;		    //!< 消息总包数
	WORD num_msg;					//!< 包序号
	BYTE check_msg;					//!< 校验码
}STR_HEAD_MSG;

/*! 消息应答  */
typedef struct
{
	WORD num_response;
	WORD id_response;
	BYTE result_response;
}STR_RESPONSE_MSG;


/*! 终端注册消息体数据格式 */
typedef struct
{
	WORD province_ID;  				//!< 省域ID
	WORD city_ID;					//!< 市县域ID
	BYTE manufacturer_ID[5];	    //!< 制造商ID
	BYTE dev_model[5];				//!< 终端型号
	BYTE dev_ID[20];				//!< 终端ID
	BYTE car_color;					//!< 车牌颜色
  STRING car_flag;					//!< 车辆标识
	
}STR_DEV_REGISTER;

typedef struct
{
	DWORD video_ctl_time;
	DWORD video_ctl_distance;	
}STR_VIDEO;

/*! 命令参数 */
typedef struct
{
    BYTE  connect_arg;                      //!< 连接控制
    STRING dial_name_arg;                   //!< 拨号点名称
    STRING dial_user_arg;                   //!< 拨号用户名
    STRING dial_pwd_arg;                    //!< 拨号密码
    STRING address_arg;                     //!< 地址
    WORD tcp_port;                          //!< TCP 端口
    WORD udp_port;                          //!< UDP 端口
    BYTE manufacturer_ID[5];                //!< 制造商ID
    STRING supervise_authentication_code;   //!< 监管平台鉴权码
    STRING dev_version;                     //!< 硬件版本
    STRING firmware_version;	            //!< 固件版本
    STRING address_url;                     //!< URL 地址
    WORD connect_special_time;              //!< 连接到指定服务器时限
}STR_CTL_CMD_PARAMETER;

/*! 终端属性 */
typedef struct
{
	WORD dev_type;                      //!< 终端类型
	BYTE manufacturer_ID[5];            //!< 制造商ID
	BYTE dev_model[20];					//!< 终端型号
	BYTE dev_ID[7];					    //!< 终端ID	
	BCD ICCID[10];                      //!< 终端SIM 卡ICCID
	BYTE dev_version_len;               //!< 终端硬件版本号长度
	STRING dev_version;	                //!< 终端硬件版本号
	BYTE firmware_version_len;          //!< 终端固件版本号长度
	STRING firmware_version;	        //!< 终端固件版本号
	BYTE gnns;                          //!< GNSS 模块属性
	BYTE communication_module;          //!< 通信模块属性
	
}STR_DEV_ATTR;

/*! 终端升级包 */
typedef struct
{
	WORD upload_type;           //!< 终端类型
	BYTE manufacturer_ID[5];    //!< 制造商ID
	BCD ICCID[10];              //!< 终端SIM 卡ICCID
	BYTE dev_version_len;       //!< 版本号长度
	BYTE dev_version;	        //!< 版本号
	DWORD upload_data_len;
}STR_DEV_UPLOAD;

/*! 位置基本信息 */
typedef struct
{
	DWORD alarm_flag;   //!< 报警标志
	DWORD status;       //!< 状态
	DWORD latitude ;    //!< 纬度
	DWORD longitude;    //!< 经度
	WORD high;          //!< 高程
	WORD speed;         //!< 速度
	WORD direction;     //!< 方向
	BCD time[6];        //!< 时间
}STR_LOCATION_INF;


/*! 位置附加信息 */
typedef struct
{
    BYTE extra_id;
    BYTE extra_len;
    
}STR_LOCATION_EXTRA_INF;

/*! 圆形区域的区域项内容数据格式 */
typedef struct
{
    DWORD area_id;              //!< 区域ID
    WORD area_arrt;             //!< 区域属性
    DWORD center_longitude;     //!< 中心点纬度
    DWORD center_latitude;      //!< 中心点经度
    DWORD radial;               //!< 半径
    BCD startTime[6];           //!< 起始时间
    BCD endTime[6];             //!< 结束时间
    WORD speedTop;              //!< 最高速度
    BYTE speedTime;             //!< 超速持续时间  
}STR_AREA_CIRCLE;

/*! 设置圆形区域消息体数据格式  */
typedef struct
{
    BYTE attr;               //!< 设置属性
    BYTE count;              //!< 区域总数
    STR_AREA_CIRCLE *area;   //!< 区域项
    
}STR_AREA_MSG;

/*! 查询指定终端参数消息体数据格式 */
typedef struct
{
    BYTE count;   //!< 参数总数 
    BYTE *idList; //!< 参数ID 列表 
}STR_PARAMETER_LIST;

typedef struct
{
	DWORD id;
	BYTE  len;
	STR_PARAMETER_LIST  *data;
}STR_PARAMETER;

/*! 驾驶员身份信息 */
typedef struct
{
	BYTE status;                //!< 状态
	BCD  time[6];               //!< 时间
	BYTE read_card_result;      //!< IC 卡读取结果
    BYTE name_len;              //!< 驾驶员姓名长度
    STRING name;                //!< 驾驶员姓名
    BYTE certification_code[20];//!< 从业资格证编码
    BYTE certification_len;     //!< 发证机构名称长度
    STRING certification_name;  //!<  发证机构名称
    BCD deadline[4];            //!< 证件有效期
  
}STR_DRIVER;

typedef struct
{
    WORD dataLen;
    BYTE *data;
}STR_DATA;

/*! 定位数据批量上传数据格式 */
typedef struct
{
    WORD dataCount; //!< 数据项个数
    BYTE dataType;  //!< 位置数据类型
    WORD dataLen;   //!< 位置汇报数据体长度
    STR_DATA *data; //!< 位置汇报数据体
}STR_DATA_UPLOAD;

typedef struct
{
    BYTE can_id[4];  //!< CAN ID
    BYTE can_data[8];//!< CAN DATA    
}STR_CAN;


/*! CAN 总线数据 */
typedef struct
{
    WORD dataCount;        //!< 数据项个数
    BCD dataReceiveTime[5];//!< CAN 总线数据接收时间
    STR_CAN *can;

}STR_DATA_CAN_UPLOAD;

/*! 多媒体数据 */
typedef struct
{
    DWORD id;                   //!< 多媒体ID
    BYTE  type;                 //!< 多媒体类型
    BYTE  media_encode;         //!< 多媒体格式编码
    BYTE  event_encode;         //!<  事件项编码
    BYTE  channel_id;           //!< 通道ID
    BYTE  location_msg[28];     //!< 位置信息汇报(0x0200)消息体
    STRING media_package;       //!< 多媒体数据包
}STR_MEDIA;


/*! 多媒体数据检索 */
typedef struct
{
    WORD serialID;      //!< 应答流水号
    WORD dataCount;     //!< 多媒体数据总项数
    STR_MEDIA *data;    //!< 检索项
}STR_MEDIA_CHECK;

#endif //end of JTT808_MODULE

/**
  * @}
  */


#endif
